export const createState = () => () => ({
  list: [], // 主要存放ID
  data: {}, // 存放和ID对应的数据
  error: null, // 错误信息
  loading: false, // 加载中
})

export const createMutations = () => ({
  getInit (state) {
    state.loading = true
  },

  getSuccess (state, data = []) {
    state.error = null
    state.loading = false

    data.forEach((item) => {
      const { id } = item

      // 防止脏数据
      // 只存有ID的数据
      if (id) {
        state.list.push(item.id) // 存ID
        state.data[id] = item // 存数据
        // this._vm.$set(state.data, id, item) // 存数据
      }
    })
  },

  getFailure (state, error) {
    state.loading = false

    this._vm.$set(state, 'error', error)
  },

  updateItem (state, data = {}) {
    state.error = null
    state.loading = false

    const { id } = data

    if (!id) {
      return
    }

    if (state.data.hasOwnproperty(id)) {
      state.data[id] = data // 存数据
    } else {
      this._vm.$set(state.data, id, data) // 首次存入，使数据响应式
    }
  },

  clear (state) {
    state.list = []
    state.data = {}
    state.error = null
    state.loading = false
  },
})

export const createActions = () => ({
  get (api, clearPrevFetchData = true) {
    return function ({ commit }) {
      commit('getInit')

      if (clearPrevFetchData) {
        commit('clear') // 清空之前的数据
      }

      return (
        this.$axios.get(api)
          .then((resp) => {
            commit('getSuccess', resp)

            return resp
          })
          .catch(error => commit('getFailure', error))
      )
    }
  },

  getItem (api) {
    return function ({ commit }) {
      return (
        this.$axios.get(api)
          .then((resp) => {
            // TODO:

            return resp
          })
          .catch((error) => {
            // TODO:

            console.log(error)
          })
      )
    }
  },

  create (api) {
    return function ({ commit }) {
      return (
        this.$axios.post(api)
          .then((resp) => {
            // TODO:

            return resp
          })
          .catch((error) => {
            // TODO:

            console.log(error)
          })
      )
    }
  },

  update (api) {
    return function ({ commit }) {
      return (
        this.$axios.update(api)
          .then((resp) => {
            // TODO:

            return resp
          })
          .catch((error) => {
            // TODO:

            console.log(error)
          })
      )
    }
  },

  delete (api) {
    return function ({ commit }) {
      return (
        this.$axios.delete(api)
          .then((resp) => {
            // TODO:

            return resp
          })
          .catch((error) => {
            // TODO:

            console.log(error)
          })
      )
    }
  },
})
